/*
菜品相关路由
*/

// 创建路由器
const express = require("express");
//引入连接池
const pool = require("../../pool");

//引入multer中间件用于上传文件
const multer = require("multer");
//设置multer 指定文件临时保存的文件夹
const upload = multer({ dest: "public/img/tmp" });
//引入FS文件管理模块
const fs = require("fs");

//定义路由器
const router = express.Router();
//抛出路由器
module.exports = router;

/*
API: GET /dish
获取所有的菜品 按照类别进行分类
返回数据:
[
    {cid:1,cname:"肉类",dishList:[{title:猪肉,price:32...,details:'...'},{...},{...}}]}
    {cid:2,cname:"素类",dishList:[{title:..,price:32...},{...},{...}}]}
    {cid:3,cname:"汤类",dishList:[{title:..,price:32...},{...},{...}}]}
]
*/

router.get("/", (req, res) => {
  pool.query("SELECT cid,cname FROM xfn_category ORDER BY cid", (err, result) => {
    if (err) throw err;
    //第一次保存了所有类目的数组
    let dataList = result;
    //保存遍历次数
    let count = 0;
    //所有类目数组
    // console.log(dataList);
    //forEach 遍历将所有对象对应cid 作为查询条件 并加入到新数组中
    dataList.forEach((item, i) => {
      //按照oid降序排列 ORDER BY oid DESC
      pool.query("SELECT * FROM xfn_dish WHERE categoryId=? ORDER BY did DESC", item.cid, (err, result) => {
        if (err) throw err;
        // 每次遍历一次就把对应类目下的菜品详细对象加入到data中
        item.dishList = result;
        //并且count++ 来统计遍历次数
        count++;
        //必须保证所有类别下的菜品都查询完成才可以发送响应  因为响应只允许发送1次
        // 所有SELECT语句都是异步执行的
        if (count == dataList.length) {
          res.send(dataList);
        }
      });
    });
  });
});

/*
API: POST /dish/image
含义:接受客户端上传的图片文件上传 保存在服务器上 返回这张图片在服务器上的随机文件名
返回数据: 
*/
//调用文件上传中间件 只针对这个路由 upload.single(文件名叫dishImg 必须和浏览器的 type="file" name="dishImg" 一致) 表示只上传1个文件
router.post("/image", upload.single("dishImg"), (req, res) => {
  // console.log(req.file); //客户端上传图片
  // console.log(req.body); //客户端随同图片提交的字符数据
  //将客户端上传的文件从临时目录转移到永久的图片路径下
  let tmpFile = req.file.path; //临时文件路径
  //通过字符串最后一个 点 出现的下标位置开始 截取字符串  从而实现获取  .jpg .png 的后缀名
  let tmpSuffix = req.file.originalname.substr(req.file.originalname.lastIndexOf("."));
  // console.log(tmpSuffix)

  //文件新路径
  let newFileName = randFileName(tmpSuffix); //调用提前定义的 随机生成当前时间和4位随机数的 文件名 作为 新文件目录下的文件名
  //转移到新目录 public/img/dish/文件名.jpg
  fs.rename(tmpFile, "public/img/dish/" + newFileName, () => {
    console.log("文件转移实际地址完毕");
    //将新地址路径名返回到客户端
    res.send({ code: 200, msg: "upload succ", fileName: newFileName });
  });
});

//生成一个随机文件名 参数 后缀名.jpg .png ..
function randFileName(suffix) {
  //当前时间的时间戳
  let time = new Date().getTime();
  //随机生成的4位数
  let num = Math.floor(Math.random() * (10000 - 100) + 1000);
  //返回示例 12883194919-4259.jpg
  return time + "-" + num + suffix;
}

/*
API: POST /dish
添加一个新的菜品
请求参数:{title:'xx',imgUrl:'xxx.jpg',price:'xxx',detail:'xxx',categoryId:'xx'}
返回数据:{code:200,msg:'dish added succ',dishId:46}
*/

router.post("/", (req, res) => {
  let data = req.body;
  pool.query("INSERT INTO xfn_dish SET ?", data, (err, result) => {
    if (err) throw err;
    res.send({ code: 200, msg: "dish add success!", dishId: result.insertId }); //result.insertId  代表服务器自己主键自增的did
  });
});

/*
API: DELETE /dish/:did
删除一个新的菜品
请求参数:/:did
返回数据:{code:200,msg:'dish remove succ'}
*/

router.delete("/:did", (req, res) => {
  pool.query("DELETE FROM xfn_dish WHERE did=?", req.params.did, (err, result) => {
    if (err) throw err;
    //获取DELETE 语句 实际影响的行数 必须大于0 才是删除成功
    if (result.affectedRows > 0) {
      res.send({ code: 200, msg: "1 dish deleted success!" });
    } else {
      res.send({ code: 400, msg: "0 dish delete" });
    }
  });
});

/*
API: put /dish
修改一个新的菜品
请求参数:{did:'xx'.....}
返回数据:{code:200,msg:'dish updated succ'}
*/

router.put("/", (req, res) => {
  let data = req.body;
  pool.query("UPDATE xfn_dish SET ? WHERE did=?", [data, data.did], (err, result) => {
    if (err) throw err;
    //获取UPDATA 受改动的行必须大于0 才是修改成功
    if (result.changedRows > 0) {
      //正常改动成功！
      res.send({ code: 200, msg: "1 dish updata success !" });
    } else if (result.affectedRows == 0) {
      //数据库中不存在要修改的CID
      res.send({ code: 400, msg: "0 dish updata not exists" });
    } else if (result.affectedRows == 1 && result.changedRows == 0) {
      //改动 但值无变化
      res.send({ code: 401, msg: "0 No change" });
    }
  });
});
